package edu.cgpi.view;

import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JToggleButton;
import javax.swing.SwingConstants;

import edu.cgpi.core.comando.Comando;
import edu.cgpi.core.util.ConversorXML;
import edu.cgpi.core.util.FabricaComandos;
import edu.cgpi.core.util.TipoImagem;

public class PainelBotoes extends Panel {

	private static final long serialVersionUID = 3749112330971343652L;
	
	private List<BotaoSelecaoImagem> botoesImagem;
	private TipoImagem ultimoTipoImagem;
	
	public PainelBotoes() {
		GerenciadorUI.getInstance().setPainelBotoes(this);
		botoesImagem = new ArrayList<BotaoSelecaoImagem>();
		inicializar();
	}

	public void inicializar() {
		setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
		
		for (TipoImagem tipoImagem : TipoImagem.values()) {
			BotaoSelecaoImagem botao = criarBotao(tipoImagem);
			botao.setVerticalAlignment(SwingConstants.CENTER);
			botoesImagem.add(botao);
			add(botao);
		}

		JButton botaoDesfazer = new JButton("Desfazer");
		botaoDesfazer.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				handleDesfazer();
			}
		});
		add(botaoDesfazer);
		
		JButton botaoSelecaoCor = new JButton("Selecionar Cor");
		botaoSelecaoCor.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				GerenciadorUI.getInstance().selecionarCor();
			}
		});
		add(botaoSelecaoCor);
		
		JButton botaoSalvar = new JButton("Salvar");
		botaoSalvar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JFileChooser fileChooser = new JFileChooser();
				fileChooser.showSaveDialog(null);
				File arquivo = fileChooser.getSelectedFile();
				handleSalvar(arquivo);
			}
		});
		add(botaoSalvar);
		
		JButton botaoAbrir = new JButton("Abrir");
		botaoAbrir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JFileChooser fileChooser = new JFileChooser();
				fileChooser.showSaveDialog(null);
				File arquivo = fileChooser.getSelectedFile();
				handleAbrir(arquivo);
			}
		});
		add(botaoAbrir);
	}

	public TipoImagem getTipoImagemSelecionada() {
		for (BotaoSelecaoImagem botao : botoesImagem) {
			if (botao.isSelected()) {
				return botao.getTipoImagem();
			}
		}
		throw new RuntimeException("N�o foi poss�vel encontrar um bot�o selecionado.");
	}

	private void deselecionarBotoes() {
		for (JToggleButton botao : botoesImagem) {
			botao.setSelected(false);
		}
	}

	private BotaoSelecaoImagem criarBotao(TipoImagem tipoImagem) {
		BotaoSelecaoImagem botao = new BotaoSelecaoImagem(tipoImagem.getNome(), tipoImagem);
		botao.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				handleSelecionarBotao(evt);
			}
		});
		return botao;
	}

	private void handleSelecionarBotao(ActionEvent evt) {
		deselecionarBotoes();
		
		if(ultimoTipoImagem != null){			
			Comando ultimoComando = FabricaComandos.criarComando(ultimoTipoImagem);
			GerenciadorUI.getInstance().getPainelDesenho().removeMouseListener(ultimoComando);
			GerenciadorUI.getInstance().getPainelDesenho().removeMouseMotionListener(ultimoComando);
		}
		
		BotaoSelecaoImagem botao = (BotaoSelecaoImagem) (evt.getSource());
		botao.setSelected(true);
		
		ultimoTipoImagem = botao.getTipoImagem();
		Comando comando = FabricaComandos.criarComando(ultimoTipoImagem);
		
		GerenciadorUI.getInstance().getPainelDesenho().addMouseListener(comando);
		GerenciadorUI.getInstance().getPainelDesenho().addMouseMotionListener(comando);
	}

	private void handleDesfazer() {
		GerenciadorUI.getInstance().getPainelDesenho().removerUltimaImagem();
		GerenciadorUI.getInstance().getPainelDesenho().repaint();
	}
	
	private void handleSalvar(File arquivo) {
		ConversorXML.paraXML(GerenciadorUI.getInstance().getPainelDesenho().getImagens(), arquivo);
	}
	
	private void handleAbrir(File arquivo) {
		GerenciadorUI.getInstance().getPainelDesenho().setImagens(ConversorXML.deXML(arquivo));
	}
}